/*
 * Copyright 2023 Salesforce, Inc. All rights reserved.
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.runtime.core.internal.lock;

import org.mule.runtime.api.lifecycle.Disposable;
import org.mule.runtime.api.lock.LockFactory;

import java.util.concurrent.TimeUnit;

/**
 * Holds reference to all the obtained locks using {@link LockFactory} in order to release memory of no longer referenced locks.
 *
 */
public interface LockGroup extends Disposable {

  /*
   * Gets a lock over the resource identified with lockId
   */
  void lock(String lockId);

  /*
   * Releases lock over the resource identified with lockId
   */
  void unlock(String lockId);

  /**
   * Tries to acquire the lock for a certain amount of time
   *
   * @param timeout  the time in timeUnit to wait until the lock is acquired
   * @param timeUnit the time unit of timeout
   * @return true if the lock was successfully acquired, false otherwise
   * @throws java.lang.InterruptedException if thread was interrupted during the lock acquisition
   */
  boolean tryLock(String lockId, long timeout, TimeUnit timeUnit) throws InterruptedException;

  boolean tryLock(String lockId);

  void lockInterruptibly(String lockId) throws InterruptedException;
}
